/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.wisnu.scs.controller;

import com.wisnu.scs.add.DateFactory;
import com.wisnu.scs.entity.DbBarang;
import com.wisnu.scs.entity.DbBarangMasuk;
import com.wisnu.scs.error.ErrorMessage;
import com.wisnu.scs.model.DbBarangMasukModel;
import com.wisnu.scs.view.DbBarangMasukView;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.view.JasperViewer;

/**
 *
 * @author Wisnu Wardoyo
 */
public class DbBarangMasukController {

    private DbBarangMasukModel model;

    public void setModel(DbBarangMasukModel model) {
        this.model = model;
    }

    public void resetForm() {
        model.resetForm();
    }

    public void insertPemasukan(DbBarangMasukView view) {

        if (view.getComboName().getSelectedIndex() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Pilih Item Untuk dimasukan");
            return;
        }

        DbBarang barang = view.getDbBarang();
        String sumberDana = view.getTxtSumberDana().getText();
        Date tanggalMasuk = (Date) view.getTxtTanggalMasuk().getValue();
        String jumlah = view.getTxtJumlah().getText();
        String keterangan = view.getTxtKeterangan().getText();

        if (sumberDana.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Sumber Dana masih Kosong");
        } else if (sumberDana.length() > 255) {
            JOptionPane.showMessageDialog(view, "Sumber Dana Tidak Boleh Lebih dari 255 karakter");
        } else if (jumlah.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Jumlah Masih kosong");
        } else {
            Integer jumlahInt = 0;
            try {
                jumlahInt = Integer.parseInt(jumlah);
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(view, "Jumlah harus angka");
                return;
            }
            barang.setStock(barang.getStock() + jumlahInt);
            model.setBarang(barang);
            model.setTanggalMasuk(tanggalMasuk);
            model.setSumberDana(sumberDana);
            model.setJumlah(jumlahInt);
            model.setKeterangan(keterangan);
            try {
                model.insertPemasukan();
            } catch (ErrorMessage ex) {
                JOptionPane.showMessageDialog(view, new Object[]{
                    "Tthrowableerjadi error pada database dengan pesan :",
                    ex.getMessage()
                });
            } finally {
                model.resetForm();
            }

        }

    }

    public void updatePemasukan(DbBarangMasukView view) {
        if (view.getComboName().getSelectedIndex() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Pilih Item Untuk dimasukan");
            return;
        } else if (view.getTableBarangMasuk().getSelectedRowCount() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Seleksi Baris dalam Tabel untuk dirubah");
            return;
        }

        DbBarang barang = view.getDbBarang();
        DbBarangMasuk barangMasukBegin = view.getDbBarangMasuk();

        Integer idMasuk = Integer.parseInt(view.getTxtIdPemasukan().getText());
        String sumberDana = view.getTxtSumberDana().getText();
        Date tanggalMasuk = (Date) view.getTxtTanggalMasuk().getValue();
        String jumlah = view.getTxtJumlah().getText();
        String keterangan = view.getTxtKeterangan().getText();

        if (sumberDana.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Sumber Dana masih Kosong");
        } else if (sumberDana.length() > 255) {
            JOptionPane.showMessageDialog(view, "Sumber Dana Tidak Boleh Lebih dari 255 karakter");
        } else if (jumlah.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Jumlah Masih kosong");
        } else {
            Integer jumlahInt = 0;
            try {
                jumlahInt = Integer.parseInt(jumlah);
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(view, "Jumlah harus angka");
                return;
            }

            if ((barangMasukBegin.getJumlah() - jumlahInt) > barang.getStock()) {
                JOptionPane.showMessageDialog(view, "Perubahan jumlah tidak sesuai");
            } else {
                if (barangMasukBegin.getJumlah() > jumlahInt) {
                    barang.setStock(barang.getStock() - (barangMasukBegin.getJumlah() - jumlahInt));
                } else {
                    barang.setStock(barang.getStock() + (jumlahInt - barangMasukBegin.getJumlah()));
                }
                model.setBarang(barang);
                model.setIdPemasukan(idMasuk);
                model.setTanggalMasuk(tanggalMasuk);
                model.setSumberDana(sumberDana);
                model.setJumlah(jumlahInt);
                model.setKeterangan(keterangan);
                try {
                    model.updatePemasukan();
                    JOptionPane.showMessageDialog(view, "Berhasil dirubah");
                    model.resetForm();
                } catch (ErrorMessage ex) {
                    JOptionPane.showMessageDialog(view, new Object[]{
                        "Terjadi error pada database dengan pesan :",
                        ex.getMessage()
                    });
                }
            }
        }

    }

    public void deletePemasukan(DbBarangMasukView view) {
        if (view.getComboName().getSelectedIndex() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Pilih Item Untuk dimasukan");
            return;
        } else if (view.getTableBarangMasuk().getSelectedRowCount() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Seleksi Baris dalam Tabel untuk dirubah");
            return;
        }

        DbBarang barang = view.getDbBarang();
        DbBarangMasuk barangMasukBegin = view.getDbBarangMasuk();

        Integer idMasuk = Integer.parseInt(view.getTxtIdPemasukan().getText());
        String sumberDana = view.getTxtSumberDana().getText();
        Date tanggalMasuk = (Date) view.getTxtTanggalMasuk().getValue();
        String jumlah = view.getTxtJumlah().getText();
        String keterangan = view.getTxtKeterangan().getText();
        if (JOptionPane.showConfirmDialog(view, "Anda yakin akan menghapus?") == JOptionPane.OK_OPTION) {
            if ((barang.getStock() - barangMasukBegin.getJumlah()) < 0) {
                JOptionPane.showMessageDialog(view, "Perubahan jumlah tidak sesuai");
            } else {
                barang.setStock(barang.getStock() - barangMasukBegin.getJumlah());
                model.setBarang(barang);
                model.setIdPemasukan(idMasuk);
                model.setTanggalMasuk(tanggalMasuk);
                model.setSumberDana(sumberDana);
                model.setJumlah(barangMasukBegin.getJumlah());
                model.setKeterangan(keterangan);
                try {
                    model.deletePemasukan();
                    JOptionPane.showMessageDialog(view, "Berhasil dihapus");
                    model.resetForm();
                } catch (ErrorMessage ex) {
                    JOptionPane.showMessageDialog(view, new Object[]{
                        "Terjadi error pada database dengan pesan :",
                        ex.getMessage()
                    });
                }
            }
        }

    }

    public void searchPemasukan(DbBarangMasukView view) {
        String searchText = view.getTxtSearchText().getText();
        Date fisrtDate = new Date();
        Date lastDate = new Date();
        try {
            fisrtDate = (Date) view.getTxtFirstDate().getValue();
            lastDate = (Date) view.getTxtLastDate().getValue();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(view, "Format tanggal salah, silahkan reset");
        }

        model.setSearchText(searchText);
        if (view.getRadioByDate().isSelected()) {
            model.setFirstDate(fisrtDate);
            try {
                model.searchBarangMasukByDate();
            } catch (ErrorMessage ex) {
                JOptionPane.showMessageDialog(view, new Object[]{
                    "Terjadi error pada database dengan pesan :",
                    ex.getMessage()
                });
            } finally {
                model.resetForm();
            }

        } else if (view.getRadioByMonth().isSelected() == true) {
            model.setListDate(DateFactory.getMonthOfDay(fisrtDate));
            try {
                model.searchBarangMasukByMonth();

            } catch (ErrorMessage ex) {
                JOptionPane.showMessageDialog(view, new Object[]{
                    "Terjadi error pada database dengan pesan :",
                    ex.getMessage()
                });
            } finally {
                model.resetForm();
            }
        } else if (view.getRadioByRange().isSelected()) {
            if (fisrtDate.after(lastDate)) {
                JOptionPane.showMessageDialog(view, "Tanggal Awal tidak boleh lebih dari tanggal akhir");
                model.resetForm();

            } else {
                List<Date> listDate = new ArrayList<>();
                listDate.add(fisrtDate);
                listDate.add(lastDate);
                model.setListDate(listDate);
                System.out.println("range");
                try {
                    model.searchBarangMasukByRange();
                } catch (ErrorMessage ex) {
                    JOptionPane.showMessageDialog(view, new Object[]{
                        "Terjadi error pada database dengan pesan :",
                        ex.getMessage()
                    });
                } finally {
                    model.resetForm();
                }
            }

        } else {
            try {
                model.searchBarangMasuk();

                System.out.println("Key");
            } catch (ErrorMessage ex) {
                JOptionPane.showMessageDialog(view, new Object[]{
                    "Terjadi error pada database dengan pesan :",
                    ex.getMessage()
                });
            } finally {
                model.resetForm();
            }
        }
    }

    public void print(DbBarangMasukView view) {
        try {
            String reportName = "./report/com/wisnu/scs/report/DbBarangMasuk.jrxml";
            JasperDesign jasperDesign = JRXmlLoader.load(reportName);
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
            Map map = new HashMap();
            //map.put("Periode", view.getPeriod());
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map,
                    new JRBeanCollectionDataSource(
                            getDataTable(view)));
            JasperViewer.viewReport(jasperPrint, false);
        } catch (JRException ex) {
            Logger.getLogger(DbBarangController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    protected List<Object> getDataTable(DbBarangMasukView view) {
        List<Object> object = new LinkedList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MMMM-YYYY");
        for (int i = 0; i < view.getTableBarangMasuk().getRowCount(); i++) {
            com.wisnu.scs.report.model.DbBarangMasuk barangMasuk = new com.wisnu.scs.report.model.DbBarangMasuk();
            barangMasuk.setNamaBarang((String) view.getTableBarangMasuk().getValueAt(i, 1));
            String date = sdf.format((Date) view.getTableBarangMasuk().getValueAt(i, 2));
            barangMasuk.setTanggalMasuk(date);

            barangMasuk.setSumberDana((String) view.getTableBarangMasuk().getValueAt(i, 3));
            barangMasuk.setJumlah((Integer) view.getTableBarangMasuk().getValueAt(i, 4));
            barangMasuk.setKeterangan(String.valueOf(view.getTableBarangMasuk().getValueAt(i, 5)));
            object.add(barangMasuk);
        }
        return object;

    }

}
